AWS SAMでデプロイ済みのAPI Gatewayの不要な「Stage」を削除する
かなーーりむかしにAWS SAMで作成したAPIを眺めていると、不要なステージ(Stage)の存在に気づきました。
デプロイ済みのAPIから、この不要なステージを削除してみました。 なお、OpenAPIを使わずにデプロイしたAPIを扱います。
おすすめの方
- AWS SAMでOpenAPIを利用しないAPI(デプロイ済み)から不要な「Stage」を削除したい方
準備:APIをデプロイする(複数のステージがある)
sam init
sam init \ --runtime python3.9 \ --name ApiGateway-Stage-Sample \ --app-template hello-world \ --no-tracing \ --package-type Zip
AWS SAMテンプレート
AWS::Serverless::Api
の定義をせず、AWS SAMにお任せしています。OpenAPIも利用しません。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: ApiGateway-Stage-Sample Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello_world/ Handler: app.lambda_handler Runtime: python3.9 Timeout: 5 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get HelloWorldFunctionLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}
Lambdaコード
import json def lambda_handler(event, context): return { "statusCode": 200, "body": json.dumps({ "message": "hello world", }), }
デプロイ
sam deploy \ --stack-name ApiGateway-Stage-Sample-Stack \ --s3-bucket cm-fujii.genki-deploy \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset
API Gatewayのステージは、2つできた
「Prod」と「Stage」の2つのステージができました。
API Gateway用の設定にOpenApiVersion
を追加する
AWS SAMテンプレート
GlobalにOpenApiVersion
を追加しました。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: ApiGateway-Stage-Sample Globals: Api: OpenApiVersion: 3.0.1 Resources: # Serverless::Apiを作成しても良いが、APIのIDが変わるので注意 # WebApi: # Type: AWS::Serverless::Api # Properties: # OpenApiVersion: 3.0.1 # StageName: Prod HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello_world/ Handler: app.lambda_handler Runtime: python3.9 Timeout: 5 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get # RestApiId: !Ref WebApi HelloWorldFunctionLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}
なお、Resources
に次のAWS::Serverless::Api
を追加すると、新しいAPI Gatewayを作成することになり、API GatewayののID(URLにも利用される)が変わります。
デプロイ済みのAPIのURLが変わるのは嬉しくない場合が多いので、注意が必要です。
Resources: GatewaysPostApi: Type: AWS::Serverless::Api Properties: StageName: Prod OpenApiVersion: 3.0.1
デプロイ前に、Stageを手動で削除する
マネジメントコンソールなどで、Stage
を削除します。
デプロイする
さきほどのコマンドでデプロイします。成功します。
API Gatewayのステージは1つのまま(増えてない)
API Gatewayのステージは、1つのままです。増えていません。
さいごに
新しいAWS::Serverless::Api
を追加するとAPI GatewayのIDが変わる点に注意です。
参考になれば幸いです。